//
//  HMSinaHomeViewModel.swift
//  ZJCSina
//
//  Created by 朱建超 on 16/11/18.
//  Copyright © 2016年 itHeiMa. All rights reserved.
//

//1、将控制器的网络气球的方法封装到  视图模型中
//2、将数据处理成模型数据

/*
 
 -vc：
   -tableView  [HMStatuses]
    -cell      HMStatuses
 
 -vc:          HomeViewModel
   -tableView   获取视图模型的属性(模型数组)
    -cell      HMStatuses
 
 -vc:          HomeViewModel
   -tableView   获取视图模型的属性(模型数组[HMStatusesCellViewModel])
    -cell        HMStatusesCellViewModel(HMStatuses)
 
 */

import UIKit
import SDWebImage

class HMSinaHomeViewModel: NSObject {

    lazy var statuses : [HMSinaStatusesCellViewModel] = [HMSinaStatusesCellViewModel]()
    
    //专门加载数据的方法，不和UI界面打交道
    func loadData(isPull : Bool , finished : @escaping (Bool , Int) -> ()) {
        
//        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
        
        var max_id : Int64 = 0
        var since_id : Int64 = 0
        if isPull {
            
            max_id = statuses.last?.statusesCell?.id ?? 0
            if max_id != 0 {
                max_id -= 1
            }
            
        }else{
            
            since_id = statuses.first?.statusesCell?.id ?? 0
            
        }
        
//        let parameters = ["access_token" : HMSinaUserAccountViewModel.shared.access_token,
//                          "max_id" : "\(max_id )",
//                          "since_id" : "\(since_id)"]
        
        //使用HMStatusDAL来完成数据的请求
        HMSinaStatusDAL.loadHomeData(sinceId: since_id, maxId: max_id) { (array) in
            
            //如果数组为空，就请求失败
            if array == nil{
            
                finished(false,0)
                return
            
            }
            //请求成功
            var tempArray = [HMSinaStatusesCellViewModel]()
            
            for item in array! {
                
                let statusesCellModel = HMSinaStatusesCellViewModel()
                
                let statusesModel = HMSinaStatuses()
                
                //调用对象的yyModel中扩充的对象方法传入字典 ---> 数据模型
                statusesModel.yy_modelSet(with: item)
                
                //给statusesCellModel的statuses赋值
                statusesCellModel.statusesCell = statusesModel
                
                //根据statusesCellMdeol来计算行高
                //1、根据statusesCellModel来获取cell
                let cell = self.loadCell(statusesCellViewModel: statusesCellModel)
                
                //2、给cell的statusesCellModel赋值
                cell.statusesModel = statusesCellModel
                
                //3、强制提前刷新cell
                cell.layoutIfNeeded()
                
                //4、获取toolBar的最大Y值
                statusesCellModel.rowheight = cell.toolsBar.frame.maxY
                
                //添加到一个临时数组中
                tempArray.append(statusesCellModel)
            }
            
            //执行成功的回调
            //如果上拉时加载更多数据，就应该执行追加的操作
            if isPull{
                
                self.statuses = self.statuses + tempArray
                
            }else{
                
                self.statuses = tempArray + self.statuses
            }
            //            finished(true,tempArray.count)
            
            self.cacheSingleImages(imageArray: tempArray, finished: finished)
            finished(true,tempArray.count)
            
        }
        
//        HMNetworkTools.shared.request(method: .GET, urlString: urlString, parameters: parameters) { (responseObject, error) in
//            
//            if error != nil{
//                
//                finished(false,0)
////                SVProgressHUD.showError(withStatus: "世界上最遥远的距离是没有网络")
//                return
//                
//            }
//            print(responseObject ?? 0)
//            
//            //解析数据，转换为模型
//            //需要将any？ 转换为[string:any]
//            let dict = responseObject as! [String : Any]
//            
//            //尝试转换为字典类型的数组
//            guard let array = dict["statuses"] as? [[String : Any]] else{
//                
//                finished(false , 0)
//                return
//                
//            }
//            
//            //
//            let result = HMSinaStatusDAL.checkStatus(sinceId: since_id, maxId: max_id)
//            
//            //测试存储微博数据的方法
//            HMSinaStatusDAL.cacheStatus(array: array)
//            
//            //遍历数组，字典转模型
//            var tempArray = [HMSinaStatusesCellViewModel]()
//            
//            for item in array {
//                
//                let statusesCellModel = HMSinaStatusesCellViewModel()
//                
//                let statusesModel = HMSinaStatuses()
//                
//                //调用对象的yyModel中扩充的对象方法传入字典 ---> 数据模型
//                statusesModel.yy_modelSet(with: item)
//                
//                //给statusesCellModel的statuses赋值
//                statusesCellModel.statusesCell = statusesModel
//
//                //添加到一个临时数组中
//                tempArray.append(statusesCellModel)
//            }
//            
//            //执行成功的回调
//            //如果上拉时加载更多数据，就应该执行追加的操作
//            if isPull{
//            
//                self.statuses = self.statuses + tempArray
//                
//            }else{
//            
//                self.statuses = tempArray + self.statuses
//            }
////            finished(true,tempArray.count)
//            
//            self.cacheSingleImages(imageArray: tempArray, finished: finished)
//        }
        
    }
    
    //下载单张图片
    private func cacheSingleImages(imageArray : [HMSinaStatusesCellViewModel] , finished : @escaping (Bool , Int) -> ()) {
        
        if imageArray.count == 0 {
            //一定要执行回调
            finished(true , 0)
            
            return
        }
        
        //遍历视图模型
        //使用调度组 入组和出组必须成对出现
        let group = DispatchGroup()
        for viewModel in imageArray {
            
            if viewModel.imageURL?.count == 1 {
                
                //只有一张图片
                //执行下载图片的操作
                //异步任务，所有异步任务执行完毕之后，再进行回调
                //在开始异步任务之前，执行入组的操作,调度组中的异步任务+1
                group.enter()
                
                let urlString = URL(string: viewModel.imageURL?.first?.wap360 ?? "")
                
                SDWebImageManager.shared().downloadImage(with: urlString, options: [], progress: nil, completed: { (_, _, _, _, _) in
                    
                    print("单张图片下载成功")
                    //出组的操作，表示调度组中的异步任务-1
                    group.leave()
                })
                
            }
            
        }
        
        //执行统一的回调
        group.notify(queue: DispatchQueue.main) {
            
            finished(true , imageArray.count)
            
        }
        
    }
    
    private func loadCell(statusesCellViewModel : HMSinaStatusesCellViewModel) -> HMSinaStatusesCell {
        
        if statusesCellViewModel.statusesCell?.retweeted_status == nil {
            
            return originalCell
            
        }
        return zhuanFaCell
    }
    
}
